package ace.module.product.core.impl.manager.plugin;

import ace.cmp.core.model.R;
import ace.module.product.api.model.bo.PmsProductStockDetailBo;
import ace.module.product.api.model.bo.PmsStockBo;
import ace.module.product.api.model.input.PmsProductStockInitOrSetInput;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import java.util.List;

/**
 * 商品库存插件管理者.
 *
 * @author Caspar
 *
 */
public interface PmsStockPluginManager {

  /**
   * sku库存初始化或设置.
   * 并且自动计算商品总库存.
   *
   * @param input 商品sku库存
   * @return 所有商品sku库存
   */
  PmsProductStockDetailBo initOrSet(PmsProductStockInitOrSetInput input);

  /**
   * 增加库存.
   *
   * @param tenantId 租户id
   * @param userSn 用户操作流水单号
   * @param skuId sku id
   * @param quantity 增加库存数量 大于0
   * @return code 0=成功   data=增加操作记录id
   */
  R<Long> add(long tenantId, @NotEmpty String userSn, long skuId, @Valid @NotNull @Positive Long quantity);

  /**
   * 增加库存.
   *
   * @param tenantId 租户id
   * @param skuId sku id
   * @param quantity 增加库存数量 大于0
   * @return code 0=成功   data=增加操作记录id
   */
  R<Long> add(long tenantId, long skuId, @Valid @NotNull @Positive Long quantity);

  /**
   * 扣减库存.
   *
   * @param tenantId 租户id
   * @param userSn 用户操作流水单号
   * @param skuId sku id
   * @param quantity 扣减库存数量 大于0
   * @return code 0=成功   data=扣减操作记录id
   */
  R<Long> subtract(long tenantId, @NotEmpty String userSn, long skuId, @Valid @NotNull @Positive Long quantity);

  /**
   * 扣减库存.
   *
   * @param tenantId 租户id
   * @param skuId sku id
   * @param quantity 扣减库存数量 大于0
   * @return code 0=成功   data=扣减操作记录id
   */
  R<Long> subtract(long tenantId, long skuId, @Valid @NotNull @Positive Long quantity);

  /**
   * 回退增加或扣减库存操作.
   *
   * @param tenantId 租户id
   * @param userSn 用户操作流水单号
   * @return code 0=成功   data=回退操作记录id
   */
  R<Long> reverse(long tenantId, @NotEmpty String userSn);

  /**
   * 回退增加或扣减库存操作.
   *
   * @param tenantId 租户id
   * @param recordId 操作记录id
   * @return code 0=成功   data=回退操作记录id
   */
  R<Long> reverse(long tenantId, @NotNull Long recordId);

  /**
   * 获取sku库存.
   *
   * @param tenantId 租户id
   * @param productSkuIds sku id
   * @return sku 库存
   */
  List<PmsStockBo> getSkuByTenantIdAndProductSkuId(long tenantId, List<Long> productSkuIds);

  /**
   * 获取sku库存明细.
   *
   * @param tenantId 租户id
   * @param productId 商品id
   * @return sku库存明细
   */
  List<PmsStockBo> getSkuByTenantIdAndProductId(long tenantId, long productId);

  /**
   * 获取商品库存总数量与sku库存明细.
   *
   * @param tenantId 租户id
   * @param productId 商品id
   * @return 商品库存总数量与sku库存明细
   */
  PmsProductStockDetailBo getProductDetailByTenantIdAndProductId(long tenantId, long productId);

  /**
   * 获取商品库存总数量.
   *
   * @param tenantId 租户id
   * @param productId 商品id
   * @return 商品库存总数量
   */
  PmsStockBo getProductByTenantIdAndProductId(long tenantId, long productId);
}
